package com.oristand.util;

import lombok.Data;

import java.io.Serializable;

/**
 * controller层的统一返回对象
 * 在controller中创建ResultResponse并且指定泛型,封装数据传给前端
 * 包含了状态码,信息和数据
 *
 * @author shiyjian
 * @version 1.0
 * @date 2021/11/25 10:12
 */
@Data
public class ResultResponse<T> implements Serializable {

    /**
     * 失败的错误信息
     */
    public final static String SELECT_FAIL = "查询失败";
    public final static String UPDATE_FAIL = "更新失败";
    public final static String DELETE_FAIL = "删除失败";
    public final static String INSERT_FAIL = "插入失败";

    /**
     * 成功的信息,可以用这里的四个,也可以自定义传string
     */
    public final static String SELECT_SUCCESS = "查询成功";
    public final static String UPDATE_SUCCESS = "更新成功";
    public final static String DELETE_SUCCESS = "删除成功";
    public final static String INSERT_SUCCESS = "插入成功";

    /**
     * 错误信息码
     */
    public final static Integer SUCCESS_CODE = 200;
    public final static Integer FAIL_CODE = 404;

    /**
     * 自定义错误信息
     */
    public final static String REQUEST_PARAMETER_ERROR = "参数错误";
    public final static String DATABASE_ERROR = "数据库错误";
    public static final String SERVICE_ERROR = "服务器异常";

    /**
     * 状态码
     */
    private int code;
    /**
     * 报错信息
     */
    private String msg;
    /**
     * 具体数据
     */
    private T data;

    /**
     * @param data 数据由controller层传过来的,是查询的任意结果
     */
    public void selectSuccess(T data) {
        this.code = SUCCESS_CODE;
        this.msg = SELECT_SUCCESS;
        this.data = data;
    }

    /**
     * 更新成功的函数
     *
     * @param row 返回更新成功是影响的行数
     */
    public void updateSuccess(T row) {
        this.code = SUCCESS_CODE;
        this.msg = UPDATE_SUCCESS;
        this.data = row;
    }

    /**
     * 删除成功的函数
     *
     * @param row 返回删除的记录条数
     */
    public void deleteSuccess(T row) {
        this.code = SUCCESS_CODE;
        this.msg = DELETE_SUCCESS;
        this.data = row;
    }

    /**
     * 添加成功的函数
     *
     * @param row 返回添加的记录条数
     */
    public void insertSuccess(T row) {
        this.code = SUCCESS_CODE;
        this.msg = INSERT_SUCCESS;
        this.data = row;
    }

    /**
     * 查询失败时调用的函数,测试data时null,错误信息可以自定义,也可以用这个类定义的常量
     *
     * @param msg 错误信息
     */
    public void selectFail(String msg) {
        this.code = FAIL_CODE;
        this.msg = msg;
        this.data = null;
    }

    /**
     * 查询失败时调用的函数,此时data时null,错误信息可以自定义,也可以用这个类定义的常量
     *
     * @param msg 错误信息
     */
    public void deleteFail(String msg) {
        this.code = FAIL_CODE;
        this.msg = msg;
        this.data = null;
    }

    /**
     * 插入失败时调用的函数,此时data时null,错误信息可以自定义,也可以用这个类定义的常量
     *
     * @param msg 错误信息
     */
    public void insertFail(String msg) {
        this.code = FAIL_CODE;
        this.msg = msg;
        this.data = null;
    }

    /**
     * 更新失败时调用的函数,此时data时null,错误信息可以自定义,也可以用这个类定义的常量
     *
     * @param msg 错误信息
     */
    public void updateFail(String msg) {
        this.code = FAIL_CODE;
        this.msg = msg;
        this.data = null;
    }

    @Override
    public String toString() {
        return "ResultResponse{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }

}
